package com.codewsq.java;

import org.junit.Test;
import org.junit.experimental.theories.suppliers.TestedOn;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;

/**
 * jdk 8之前的日期时间的API测试
 * 1. System类中currentTimeMillis();
 * 2. java.util.Date和子类java.sql.Date
 * 3. SimpleDateFormat
 * 4. Calendar
 */
public class DateTimeTest1 {

    /*
    SimpleDateFormat的使用：SimpleDateFormat对日期Date类的格式化和解析

    1.两个操作：
    1.1 格式化：日期 --->字符串
    1.2 解析：格式化的逆过程，字符串 ---> 日期

    2.SimpleDateFormat的实例化

     */
    @Test
    public void testSimpleDateFormat() throws ParseException {
        //实例化SimpleDateFormat:使用默认的构造器
        SimpleDateFormat sdfDefault = new SimpleDateFormat();
        //格式化：日期 --->字符串
        Date date = new Date();
        System.out.println("Date默认输出时间格式：" + date); // Tue Jul 27 11:55:45 CST 2021
        String format = sdfDefault.format(date);
        System.out.println("sdf默认格式化后的时间格式：" + format); // 21-7-27 上午11:55
        //将字符串解析成时间：格式化的逆过程，字符串 ---> 日期
        String dateStr = "20-7-27 上午11:54";
        Date parse = sdfDefault.parse(dateStr);
        System.out.println(parse); // Mon Jul 27 11:54:00 CST 2020

        //*************按照指定的方式格式化和解析：调用带参的构造器*****************
        System.out.println("*************按照指定的方式格式化和解析：调用带参的构造器*****************");
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        // 格式化
        String format1 = sdf.format(date);
        System.out.println(format1); // 2021-07-27 11:55:45

        // 解析:要求字符串必须是符合SimpleDateFormat识别的格式(通过构造器参数体现),否则，抛异常
        Date parse1 = sdf.parse("2020-12-20 19:00:00");
        System.out.println(parse1);
    }

    /**
     * 练习："三天打渔两天晒网"   1990-01-01  xxxx-xx-xx 打渔？晒网？
     * <p>
     * 举例：2005-01-13 ？ 总天数
     * <p>
     * 总天数 % 5 == 1,2,3 : 打渔
     * 总天数 % 5 == 4,0 : 晒网
     * <p>
     * 总天数的计算？
     * 方式一：( date2.getTime() - date1.getTime()) / (1000 * 60 * 60 * 24) + 1
     * 方式二：1990-01-01  --> 2019-12-31  +  2020-01-01 -->2020-09-08
     */
    @Test
    public void test2() {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        try {
            long startTime = sdf.parse("2005-01-13").getTime();
            long endTime = new Date().getTime();
            // 计算打鱼总天数: 当前时间戳 - 开始时间戳，然后除以每天毫秒数，可以得出总天数
            int sumDay = (int) ((endTime - startTime) / (1000 * 60 * 60 * 24) + 1);
            int result = sumDay % 5;
            System.out.println(sumDay);
            System.out.println(result);
            if (result == 1 || result == 2 || result == 3) {
                System.out.println("今天打鱼");
            } else {
                System.out.println("今天晒网");
            }
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }

    /*
     * Calendar日历类(抽象类）的使用
     * */
    @Test
    public void test3() {
        //1.实例化
        //方式一：创建其子类（GregorianCalendar）的对象
        //方式二：调用其静态方法getInstance() -- 常用
        Calendar calendar = Calendar.getInstance();
        System.out.println(calendar.getClass()); // class java.util.GregorianCalendar -- 本质上还是一个GregorianCalendar类型的对象

        // 2.常用方法
        // get(): 用于获取日历字段的值，返回值的结果也是个int类型的值。
        int year = calendar.get(Calendar.YEAR); // 获取年份
        int month = calendar.get(Calendar.MONTH); // 获取月份，因为月份是从0开始的，一月份为0，所以输出是要加1
        int day = calendar.get(Calendar.DAY_OF_MONTH); // 一个月的第几天
        int week = calendar.get(Calendar.DAY_OF_WEEK);// 一周的第几天，从周天开始，周天为1 ，以此类推，周六为7
        System.out.println(year + "年" + (month + 1) + "月" + day + "日 星期" + (week == 1 ? "日" : (week - 1)));


        // set(): 将给定的日历字段设置为给定值。
//        calendar.set(Calendar.DAY_OF_MONTH, 21); // 设置时间为当月的第21天
        calendar.set(2099, 11, 19); // 设置月份要记着减1，比如设置5月，月份参数就传4
        year = calendar.get(Calendar.YEAR); // 获取年份
        month = calendar.get(Calendar.MONTH); // 获取月份，因为月份是从0开始的，所以输出是要加1
        day = calendar.get(Calendar.DAY_OF_MONTH); // 一个月的第几天
        week = calendar.get(Calendar.DAY_OF_WEEK);// 一周的第几天，从周天开始，周天为1 ，以此类推，周六为7
        System.out.println(year + "年" + (month + 1) + "月" + day + "日 星期" + (week == 1 ? "日" : (week - 1)));

        // add(): 日历的偏移量，可以指定一个日历中的字段，进行整数的偏移
        calendar.add(Calendar.DAY_OF_MONTH, -30); // 在日期上减去30天，所以填-30，填正整数为加30天
        year = calendar.get(Calendar.YEAR); // 获取年份
        month = calendar.get(Calendar.MONTH); // 获取月份，因为月份是从0开始的，所以输出是要加1
        day = calendar.get(Calendar.DAY_OF_MONTH); // 一个月的第几天
        week = calendar.get(Calendar.DAY_OF_WEEK);// 一周的第几天，从周天开始，周天为1 ，以此类推，周六为7
        System.out.println(year + "年" + (month + 1) + "月" + day + "日 星期" + (week == 1 ? "日" : (week - 1)));

        // getTimt(): 把日历对象转换成Date日期对象。
        Date date = calendar.getTime();
        System.out.println(date);

        // setTime(): 将Calendar对象时间设置为当前时间date对象的时间
        Date date1 = new Date();
        calendar.setTime(date1);
        year = calendar.get(Calendar.YEAR); // 获取年份
        month = calendar.get(Calendar.MONTH); // 获取月份，因为月份是从0开始的，所以输出是要加1
        day = calendar.get(Calendar.DAY_OF_MONTH); // 一个月的第几天
        week = calendar.get(Calendar.DAY_OF_WEEK);// 一周的第几天，从周天开始，周天为1 ，以此类推，周六为7
        System.out.println(year + "年" + (month + 1) + "月" + day + "日 星期" + (week == 1 ? "日" : (week - 1)));

    }
}
